"""
中间件的本质就是装饰器，只不过被中间件装饰的是Django项目中的视图函数
中间件实现了对请求/响应的拦截和过滤，可以对请求/响应做额外的处理
中间件更常用的名字叫做拦截过滤器（filter / interceptor）
"""
import logging

from django.shortcuts import render

# 通过Python标准库logging模块的getLogger获取日志记录器
logger = logging.getLogger('django.request')


def exception_handler_middleware(view_func):

    def wrapper(request, *args, **kwargs):
        # 拦截用户请求做出相应的处理
        resp = view_func(request, *args, **kwargs)
        # 拦截服务器给用户的响应做出相应的处理
        # 检测响应状态码是不是5xx ---> 服务器程序出问题
        # 2xx ---> 请求成功
        # 3xx ---> 重定向（给浏览器发送一个新的URL，让浏览器重新请求新的URL）
        # 4xx ---> 请求有问题
        #   ~ 404 ---> Not Found
        #   ~ 401 ---> Unauthorized
        #   ~ 403 ---> Forbidden
        #   ~ 405 ---> 请求方法不支持
        #   ~ 400 ---> 请求数据格式不对
        # 5xx ---> 服务器程序有问题
        if str(resp.status_code).startswith('5'):
            # 生成一条日志记录这个错误以便通过追踪日志定位错误解决问题
            # 写日志的时候需要根据日志的级别调用不同的方法
            # debug --- 调试信息
            # info --- 普通（正常）信息
            # warning --- 警告信息
            # error --- 错误信息
            # critical --- 致命错误信息
            logger.error(f'{request.method} {request.path} ---> {resp.status_code}')
            # 渲染专门定制的优雅的错误页给用户
            return render(request, 'error.html')
        return resp

    return wrapper
